/**
 * 数组都是数字
 * 递归方案： 使用递归：
 * 递归函数的构建过程为：先假设数组中没有嵌套数组，使用遍历的方式求出数组的元素之和->然后增加处理嵌套数组元素的分支逻辑（递归调用本函数即可）
 * @param {*} arr
 * @returns
 */
function addNumbers(arr) {
  if (!Array.isArray(arr)) {
    return arr;
  }
  let result = 0;
  for (let i = 0; i < arr.length; i++) {
    result += Array.isArray(arr[i]) ? addNumbers(arr[i]) : arr[i];
  }

  return result;
}

/**
 * 方案2--转成字符串，再去除[]，再转成数组求和
 *
利用特点：针对此数组元素只有可能是数字的特性，将其先转成字符串toString，然后去掉字符串中所有的[或者]，
最后使用split还原成数组，遍历然后相加即可
 * @param {*} arr
 * @returns
 */
function addNumbers2(arr) {
  if (!Array.isArray(arr)) throw new TypeError("musted be a array");
  let result = 0;

  let str = arr.toString();

  // 替换[]
  str = str.replace(/[]/g, "");

  // 转成数组求和
  let newArr = str.split(",");

  newArr.forEach((item) => {
    result += Number(item);
  });

  return result;
}

// egg
let arr = [1, 2, [3], [[4]], 5];
console.log("[ add ] >", addNumbers(arr));
console.log("[ add ] >", addNumbers2(arr));
